PROCEDURE TForm4.TestShlWAPIPathAppend(Sender : TObject);
VAR examplenum : INTEGER;
VAR combinedpathsbuf : ARRAY[0.. MAX_PATH] OF CHAR;
VAR tooshortpathsbuf : ARRAY[0.. 32] OF CHAR;
VAR pathstrlen : DWORD;
VAR pathtoappend : STRING;
VAR apiretval : BOOL;
VAR newinfoline : STRING;
BEGIN
examplenum := 0;
FillChar(combinedpathsbuf, Length(combinedpathsbuf), #0);
FillChar(tooshortpathsbuf, Length(tooshortpathsbuf), #0);
pathstrlen := 0;
pathtoappend := '';
apiretval := FALSE;
newinfoline := '';
//Two fully qualified paths
Inc(examplenum);
combinedpathsbuf := 'C:\Windows\System32\Drivers';
pathtoappend := 'C:\Hello\World';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
//Memo1.Lines.Add(newinfoline);
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := 'C:\Hello\World';
pathtoappend := 'C:\Windows\System32\Drivers';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with '+
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
//Memo1.Lines.Add(newinfoline);
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
//A fully qualified path and a partial/relative path
Inc(examplenum);
combinedpathsbuf := 'C:\Windows\System32\Drivers';
pathtoappend := 'Hello\World';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
//Memo1.Lines.Add(newinfoline);
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := 'C:\Windows\System32\Drivers\';
pathtoappend := 'Hello\World\DummyFileName.drv';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
//Memo1.Lines.Add(newinfoline);
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := '..\Windows\System32\Drivers';
pathtoappend := '..\Hello\World';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
//Memo1.Lines.Add(newinfoline);
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := 'C:\Windows\System32\Drivers';
pathtoappend := '..\Hello\Danish Viking\Kings With Blue Teeth ';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := '..\Windows\System32\Drivers\Blue Teeth\Bluetooth.drv.sys';
pathtoappend := '..\..\Hello\Driver World';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := '..\Windows\System32\Drivers\Bluetooth\';
pathtoappend := '..\..\Hello\World\Bluto~1.inf';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := '..\Windows\System32\Drivers\Bluetooth\Repository\Bluetooth.sys';
pathtoappend := '..\..\Hello\World\Bluto~1.inf';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := '..\Windows\System32\Drivers\Cache\en-US';
pathtoappend := '../../Hello/World';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := '../Windows/System32/Drivers/Cache/en-US';
pathtoappend := '../../Hello/World';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
//Two fully qualified UNC server/share paths
Inc(examplenum);
combinedpathsbuf := '\\UNCServer1\Share1\Windows\System32\Drivers\';
pathtoappend := '\\UNCServer2\Share2\Hello\World\';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := '\\UNCServer1\Share1\Windows\System32\Drivers\' +
'Bluethooth\Bluetooth.sys';
pathtoappend := '\\UNCServer2\Share2\Hello\World\BluethoothDrivers.inf';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
//Two fully qualified "file: etc. paths"
Inc(examplenum);
combinedpathsbuf := 'file:///S:/Projects/SST/Website/en/products/' +
'development%20libraries/delphi/shlwapi/' +
'support/devref/functions/DllGetVersion.htm';
pathtoappend := '..\Hello\World\BluethoothDrivers.inf';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := 'file:\\\S:\Projects\SST\Website\en\products\' +
'development%20libraries\delphi\shlwapi\support\' +
'devref\functions\DllGetVersion.htm';
pathtoappend := '..\Hello\World\DllVersion.exe';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
//Try to force some errors by passing in invalid params
Inc(examplenum);
combinedpathsbuf := 'C:\Windows\System32\Drivers\Cache\en-US\acpi.sys.mui';
pathtoappend := ''; //Empty string
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and an empty string as the second param';
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := 'C:\Windows\System32\Drivers\Cache\en-US\' +
'battc.sys.mui';
pathtoappend := ''; //invalid (null) string
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and NIL pointer to second string';
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, NIL);
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
FillChar(combinedpathsbuf, Length(combinedpathsbuf), #0);
pathtoappend := ''; //Empty string
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
'an empty buffer and string as the first and second param';
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
combinedpathsbuf := 'C:\Windows\System32\Drivers';
pathtoappend := '..\..\..\..\..\Hello\World';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
combinedpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(combinedpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + combinedpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + combinedpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Inc(examplenum);
tooshortpathsbuf := 'C:\Windows\System32\Drivers';
pathtoappend := '..\Hello\World\New World\Dummy File Name.ext';
newinfoline := '(' + IntToStr(examplenum) + ') PathAppend called with ' +
tooshortpathsbuf + ' and ' + pathtoappend;
Memo1.Lines.Add(newinfoline);
newinfoline := 'returned : ';
apiretval := PathAppend(tooshortpathsbuf, PChar(pathtoappend));
IF apiretval THEN
newinfoline := newinfoline + 'TRUE ' + tooshortpathsbuf
ELSE
newinfoline := newinfoline + 'FALSE ' + tooshortpathsbuf;
Memo1.Lines.Add(newinfoline);
Memo1.Lines.Add('');
Memo1.Lines.Add('');
END; |
Under Windows Vista with Service Pack 1 (SP 1) and Internet Explorer 8 (IE 8), the
above code produced the following results.
Note, that in order to reduce the line lengths,
line breaks were added manually to the output
(i.e. some line breaks are not produced by the above code).
As a result, in some cases a single, very long path may extend
over several lines.
|